AWS WAF のBot Control で検証済みBotをブロックする

AWS WAF のBot Control で検証済みBotをブロックする

安全なBotであってもアクセスを抑止したい時に。
Clock Icon2024.11.13

こんにちは、なおにしです。

AWS WAF Bot Control で検証済みのBotからのアクセスをブロックする機会がありましたのでご紹介します。

はじめに

AWS WAF Bot Control は、一般的なBotによるアクセスを可視化・ルールによる抑制を行うことが出来る機能です。

Bot Controlでは検出したBotアクセスのうち、AWS によって一般的かつ検証可能なBotとして認識されている既知のBotについては、検証済み(verified)として扱われます。この検証済みBot以外はBot Control によってアクセスがブロックされますが、検証済みBotは以下に記載のとおりブロックされない動作となっています。

AWS WAF Bot Control doesn't block bots that are known by AWS to be common and verifiable bots.

https://docs.aws.amazon.com/waf/latest/developerguide/waf-bot-control-example-allow-verified-bots.html

今回環境を確認していたところ、WAF を関連付けていたCloudFrontのオリジン配下のWebサーバにおいて、Amazonbot によるアクセスが多数記録されていたことが判明しました。

https://developer.amazon.com/ja/amazonbot

上記の公式ドキュメントに記載のとおり、Amazonbot 自体はAlexa のサービス向上に使用されるWebクローラーであり、通常であれば特にブロックする必要のないものかと思います。

しかし、Amazonbotのアクセスの挙動を確認したところ、偶然かもしれませんが今回は以下のように一時的にそれなりのアクセスが来ていて、かつBot Control によってブロックされないためアクセスがWebサーバに到達していた状況でした。

20241112_naonishi_blocking-verified-bots-with-bot-control_1.png

上記のアクセスによってWebサーバの負荷に影響が発生するかどうかは環境次第ですが、場合によっては一時的にアクセスをブロックしたいこともあるかと思います。

Amazonbotのドキュメントには以下の記載もあるため、今回は検証済みBot と判断されたAmazonbotのアクセスを明示的にブロックしてみます。

Amazonbot respects standard robots.txt rules.

やってみた

特定の検証済みBotをブロックするための方法は、公式ドキュメントに例として記述がありますので、その内容のとおりに適用してみます。

https://docs.aws.amazon.com/waf/latest/developerguide/waf-bot-control-example-block-verified-bots.html

今回はブロック対象のBot名が「amazonbot」のため、Bot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)の後に実行するamazonbotブロックのためのルールでは、以下2つのラベルを持っていることを条件とします。

  • awswaf:managed:aws:bot-control:bot:name:amazonbot
  • awswaf:managed:aws:bot-control:bot:verified

上記ドキュメントではJSON表記の内容になっていますが、AWSマネジメントコンソールでvisual editorを用いて設定する場合は、以下のような内容になります。

20241112_naonishi_blocking-verified-bots-with-bot-control_2.jpg

上記ルールをBot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)の後に評価されるように設定するため、ルール一覧では以下のような順番になります。

20241112_naonishi_blocking-verified-bots-with-bot-control_3.png

また、参考までにBot Control マネージドルールグループ(AWSManagedRulesBotControlRuleSet)およびamazonbotをブロックするルールを作成するCloudFormation テンプレート(CloudFrontへの関連付け用)も記載します。

AWSTemplateFormatVersion: "2010-09-09"

Description: Block verified bots with AWS WAF Bot Control.

Parameters:
  TargetBotName:
    Description: Target verified bot name
    Type: String
    Default: amazonbot

Resources:
  WAFWebACL:
    Type: AWS::WAFv2::WebACL
    Properties:
      Name: test-block-verified-webacl
      Description: Web ACL to test blocking verified bots.
      Scope: CLOUDFRONT
      DefaultAction:
        Allow: {}
      VisibilityConfig:
        SampledRequestsEnabled: true
        CloudWatchMetricsEnabled: true
        MetricName: test-block-verified-webacl
      Rules:
        - Name: test-AWSManagedRulesBotControlRuleSet
          Priority: 10
          OverrideAction:
            None: {}
          Statement:
            ManagedRuleGroupStatement:
              ManagedRuleGroupConfigs:
                - AWSManagedRulesBotControlRuleSet:
                    InspectionLevel: TARGETED
                    EnableMachineLearning: true
              VendorName: AWS
              ExcludedRules: []
              Name: AWSManagedRulesBotControlRuleSet
          VisibilityConfig:
            SampledRequestsEnabled: true
            CloudWatchMetricsEnabled: true
            MetricName: test-AWSManagedRulesBotControlRuleSet

        - Name: test-bot-control-block-verified-rule
          Priority: 20
          Action:
            Block: {}
          Statement:
            AndStatement:
              Statements:
                - LabelMatchStatement:
                    Key: !Sub "wswaf:managed:aws:bot-control:bot:name:${TargetBotName}"
                    Scope: LABEL
                - LabelMatchStatement:
                    Key: awswaf:managed:aws:bot-control:bot:verified
                    Scope: LABEL
          VisibilityConfig:
            SampledRequestsEnabled: true
            CloudWatchMetricsEnabled: true
            MetricName: test-bot-control-block-verified-rule

CloudFormationでCloudFront用のWebACL を作成する際は、以下の記事に記載されているとおりus-east-1 (バージニア北部) リージョンでCloudFormationを実行する必要がありますのでご注意ください。(私もハマりました)

https://dev.classmethod.jp/articles/cloudformation-webacl-cloudfront-error/

ブロック設定の適用結果

実際にAmazonbot によるリクエストがブロックされたかどうかは、対象Web ACLs のoverviewページやBot control dashboard のページにて、「Browse bot activity」から確認することができます。

以下はWeb ACLs のoverviewページでAmazonbot のリクエスト結果を表示したものとなります。明示的なブロックのルールを追加した後は、リクエストがブロックされるようになったことが分かります。

20241112_naonishi_blocking-verified-bots-with-bot-control_4.png

まとめ

AWS WAF Bot Control でAmazonbotからのアクセスをブロックしてみました。 Bot Control は自動的にBotからのアクセスを許可・拒否してくれる便利なサービスですが、今回のように必要に応じて特定のBotをブロックすることもできますし、逆に意図しないブロックに対してはブロックしないように構成する必要があります。
今回は検証済みBotを対象にブロックしていますが、元々はAWSで特に問題のないBotと判断されているものでもありますので、Amazonbotのドキュメントに記載があるとおり、必要な場合は恒久的にはrobots.txtで抑制を行い、その他の悪意のあるBotをWAFでブロックするという方があるべきかもしれません。

本記事がどなたかのお役に立てれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.